package Shangji.Shangji4;

import org.apache.log4j.Logger;

import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Map;

public class SimpleBeanConvertor {
    private static Logger logger=Logger.getLogger(SimpleBeanConvertor.class.getName());
    public static <T> T convert(HttpServletRequest request, Class<T> targetType) throws IllegalAccessException,UnsupportedTypeException,InstantiationException, ParseException, InvocationTargetException {
        Map<String,String[]> params=request.getParameterMap();
        if (params.size()==0) {
            return null;
        }
        T target=targetType.newInstance();
        Method[] allMethods=targetType.getMethods();
        if (allMethods!=null && allMethods.length>0) {
            for (Method method:allMethods) {
                Class[] args = method.getParameterTypes();
                if (args.length==1) {
                    String paramName = method.getName().substring(3, 4).toLowerCase() + method.getName().substring(4);
                    if (params.containsKey(paramName)) {
                        try{
                            Object value=parseValue(params.get(paramName),args[0]);
                            method.invoke(target,value);
                        }catch (Exception e){
                            logger.debug("参数转换错误",e);
                            e.printStackTrace();
                        }
                    }else if (Boolean.class==args[0] || boolean.class==args[0]){
                        method.invoke(target,false);
                    }
                }
            }
        }
        return target;
    }

    private static Object parseValue(String[] value, Class type) throws ParseException,UnsupportedTypeException {

        if (String.class==type) {
            return value[0];
        }
        if (java.util.Date.class==type) {
            return new SimpleDateFormat("yyyy-MM-dd").parse(value[0]);
        }
        if (boolean.class==type || Boolean.class==type) {
            return true;
        }
        if (char.class==type) {
            return value[0].charAt(0);
        }
        if (int.class==type || Integer.class==type) {
            return Integer.valueOf(value[0]);
        }
        if (short.class==type || byte.class==type || long.class==type || float.class==type || double.class==type) {
            try {
                type=Class.forName("java.lang"+type.getName().substring(0,1).toUpperCase()+type.getName().substring(1));
            }catch (ClassNotFoundException e){
                e.printStackTrace();
            }
        }
        if (type.getName().startsWith("java.lang") || type.getName().startsWith("java.math")){
            try {
                return type.getConstructor(String.class).newInstance(value);
            } catch (Exception e) {
                throw new UnsupportedTypeException(e);
            }
        }
        return type;
    }
}
